﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <algorithm>
#include <vector>
#include <thread>
using namespace std;

//int main()
//{
//	//auto fun = []() {cout << "Hllow Word!" << endl; };
//	//fun();
//	([]() {cout << "Hllow Word!" << endl; })(); //本身是仿函数对象
//	return 0;
//}

//int main()
//{
//	int a = 1;
//	int b = 2;
//	//auto fun = [](int& a, int& b) { //这里只是只拷贝，没有然后意义
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//};
//
//	//[](int a,int b) { //这里只是只拷贝，没有然后意义
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//}(a,b);
//	//[](int &a, int &b) {  //引用参数
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//}(a, b);
//	//[a,b]()mutable {  //捕捉列表传值捕捉 因为默认是const要修改函数内的参数需要加上mutable
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//}();
//	//[&a,&b](){  //捕捉列表引用捕捉
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//}();
//	//[&a, b]()mutable {  //捕捉列表半引用捕捉 此时也涉及传值捕捉需要加上mutable
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//}();
//	//[&]() {  //全引用捕捉
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//}();
//	//[&,b]()mutable {  //全引用捕捉+传值捕捉
//	//	int tmp = a;
//	//	a = b;
//	//	b = tmp;
//	//}();
//	[=]()mutable {  //全部传值捕捉
//		int tmp = a;
//		a = b;
//		b = tmp;
//	}();
//	cout << a << ":" << b << endl;
//	return 0;
//}

//int main()
//{
//	//int a = [](int a, int b){ //返回值明确的情况下编译器会自己推导
//	//	return a + b;
//	//}(1, 2);
//	auto a = [](int a, double b)  { //只有部分自定义类型需要自己指定，大部分都可以省略 默认是double
//		return a + b;
//	}(1, 2);
//	auto a = [](int a, double b) ->int { //可以指定int
//		return a + b;
//	}(1, 2);
//	cout << a << endl;
//	return 0;
//}

//排序
//struct Goods
//{
// string _name;  // 名字
// double _price; // 价格
// int _evaluate; // 评价
// Goods(const char* str, double price, int evaluate)
// :_name(str)
// , _price(price)
// , _evaluate(evaluate)
// {}
//};
//
//int main()
//{
//	vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,
//   3 }, { "菠萝", 1.5, 4 } };
//	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {
//		return g1._price < g2._price; });
//	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {
//		return g1._price > g2._price; });
//	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {
//		return g1._evaluate < g2._evaluate; });
//	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {
//		return g1._evaluate > g2._evaluate; });
//
//	return 0;
//}

void fun(int n)
{
	for (int i = 1; i <= n; ++i)
	{
		cout << i << endl;
		this_thread::sleep_for(chrono::milliseconds(100));
	}
	cout << endl;
}

int main()
{
	//thread x(fun, 10);
	//this_thread::sleep_for(chrono::milliseconds(100));
	//thread y(fun,20);
	//x.join();
	//y.join();

	int n = 5;
	vector<thread> vv(n);
	for (int i = 0; i < n; ++i)
	{
		//vv[i] = thread([](int n) {
		vv[i] = thread([i] {

			for (int k = 1; k <= i+1; ++k)
			{
				cout <<this_thread::get_id()<<":" << i << endl;
				this_thread::sleep_for(chrono::milliseconds(100));
			}
			cout << endl;
			});
		this_thread::sleep_for(chrono::seconds(1));
	}

	for (auto& x : vv)
	{
		x.join();
	}

	return 0;
}